<?php
    /**
     * 框架名字（Framework name）：    XwenPHP
     * 框架作者（********Author）：    卢学文
     * 创建时间（****CreateDate）：    2017-11-27
     * 版权所有（*****Copyright）：    Copyright Holder lauwen
     * 联系邮箱（********E-mail）：    lauwencn@gmail.com
     */
    final class Application{
        public static function run(){
            self::_init();                                          // 初始化框架，加载框架所需文件
            self::_self_import();                                   // 加载用户自己的类库（往公共目录里添加的）
            self::_set_url();                                       // 设置外部路径变量，用于加载js、css等文件
            spl_autoload_register(array(__CLASS__,'_autoload'));    // 自动加载类文件的注册函数，用于加载未定义（未引入）的类文件
            self::_create_demo();                                   // 当初次运行框架时，为用户创建Controller的demo文件
            self::_app_run();                                       // 根据路由实例化控制器类
        } 

        /**
         * 加载用户自己的类库
         */
        private static function _self_import(){
            $fileArr = C('AUTO_LOAD_FILE');
            
            if(is_array($fileArr) && !empty($fileArr)){
                foreach($fileArr as $v){
                    require_once COMMON_LIB_PATH.'/'.$v;
                }
            }
        }

        /**
         * 实例化控制器类
         */
        private static function _app_run(){
            $ctl = isset($_GET[C('URL_CONTROLLER')]) ? $_GET[C('URL_CONTROLLER')] : 'Index';
            $met = isset($_GET[C('URL_METHOD')]) ? $_GET[C('URL_METHOD')] : 'index';
            define('CONTROLLER',$ctl);
            define('ACTION',$met);
            $ctl .= 'Controller';
            if(class_exists($ctl)){
                $obj = new $ctl();
                if(method_exists($obj,$met)){
                    $obj -> $met();
                }else{
                    if(method_exists($obj,'__empty')){
                        $obj ->__empty();
                    }else{
                        halt($ctl."控制器中".$met."方法不存在");
                    }
                }
                
            }else{
                $obj = new EmptyController();
                $obj->index();
            }

        }

        /**
         * 为应用创建demo
         */
        private static function _create_demo(){
            $path = CONTROLLER_PATH.'/IndexController.class.php';

            $str = <<<str
<?php
/**
 * 框架名字（Framework name）：    XwenPHP
 * 框架作者（********Author）：    卢学文
 * 创建时间（****CreateDate）：    2017-11-27
 * 版权所有（*****Copyright）：    Copyright Holder lauwen
 * 联系邮箱（********E-mail）：    lauwencn@gmail.com
 */
header('Content-Type:text/html;charset=utf-8');


    class IndexController extends Controller {
        public function index(){
            echo "<Strong>欢迎使用XwenPHP!</Strong><br/>";
            echo "<small>Welcome to XwenPHP!</small>";
        }
    }

?>
str;
            is_file($path) || file_put_contents($path,$str);

        }

        /**
         * 自动载入功能
         */
        private static function _autoload($className){
            switch(true){
                case strlen($className) > 10 && substr($className,-10) == 'Controller':
                    $path = CONTROLLER_PATH.'/'.$className.'.class.php';
                    if(!is_file($path)){
                        $emptyPath = CONTROLLER_PATH.'/EmptyController.class.php';
                        if(is_file($emptyPath)){
                            include $emptyPath;
                            return;
                        }else{
                            halt($path."控制器".$className."未找到");
                        }
                    }
                    include $path;
                    break;
                default:
                    $path = XTOOL_PATH.'/'.$className.'.class.php';
                    if(!is_file($path)) halt($path."类".$className."未找到");
                    include $path;
                    break;
            }
        }

        /**
         * 外部路径变量
         * http://localhost/...
         */
        private static function _set_url(){
            // p($_SERVER);
            $path = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
            $path = str_replace('\\','/',$path);

            define('__APP__',$path);
            define('__ROOT__',dirname($path));
            define('__TPL__',__ROOT__.'/'.APP_NAME.'/Tpl');
            define('__PUBLIC__',__TPL__.'/Public');
            define('__JS__',__PUBLIC__.'/js');
            define('__CSS__',__PUBLIC__.'/css');
            define('__IMAGE__',__PUBLIC__.'/image');
            define('__FONT__',__PUBLIC__.'/font');
        }


        /**
         * 初始化框架
         * 加载框架所必需文件
         */
        private static function _init(){
            C(include XCONFIG_PATH.'/config.php');

            $commonConfigPath = COMMON_CONFIG_PATH.'/config.php';
            //注：字符串内容必须定格
            $commonConfig = <<<str
<?php

    return array(
        //配置项 => 配置值

    );

?>
str;
            is_file($commonConfigPath) || file_put_contents($commonConfigPath,$commonConfig);
            
            C(include $commonConfigPath);

            $userConfigPath = CONFIG_PATH.'/config.php';
            //注：字符串内容必须定格
            $userConfig = <<<str
<?php
    return array(
        //配置项 => 配置值

    );

?>
str;
            is_file($userConfigPath) || file_put_contents($userConfigPath,$userConfig);
            C(include $userConfigPath);
            date_default_timezone_set(C('DEFAULT_TIME_ZONE'));
            C('SESSION_AUTO_START') && session_start();

        }
    }

?>